/**
 * TODO木子鱼系统平台<br/>
 * com.mzy.lock<br/>
 * SellTicket.java<br/>
 *  创建人:mofeng <br/>
 * 时间：2019年1月14日-下午4:39:43 <br/>
 * 2019木子鱼公司-版权所有<br/>
 */
package com.thh.zookeeperlock.service;

import com.thh.zookeeperlock.dao.GoodStockDao;
import com.thh.zookeeperlock.lock.ZookeeperLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.concurrent.locks.Lock;

/**
 *
 * 模拟多线程环境下资源竞争的问题
 * SellTicket<br/>
 * 创建人:mofeng<br/>
 * 时间：2019年1月14日-下午4:39:43 <br/>
 * @version 1.0.0<br/>
 *
 */
@Service
@Scope("prototype")
public class GoodsSerivice {

	@Autowired
	private GoodStockDao goodStockDao;


	//Lock lock = new ReentrantLock();
	Lock lock = new ZookeeperLock("store");

	@Transactional(rollbackFor =Exception.class)
	public  boolean buy(String userId,String goodId,int buyNum){

		lock.lock();
		try{
			boolean result = false;
			// 1: 查询商品对应的库存数。
			int num = goodStockDao.getStock(goodId);
			// 2：如果你的库存数小于购买数，当然就会出现商品库存不足.
			if(num < buyNum){
				System.out.println("商品库存不足，不在扣减....");
				return false;
			}

			try{
				Thread.sleep(100);
			}catch(Exception ex){

			}
			// 3: 如果库存充足的话，那么就直接去扣减商品库存
			System.out.println("用户"+userId+",扣减商品："+goodId+"，数量：" + buyNum);
			result =goodStockDao.buy(userId,goodId,buyNum);
			System.out.println("用户"+userId+",扣减商品之后："+goodId+"，结果是：" + result);

			return result;
		}finally {
			lock.unlock();
		}
	}
}
